<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <style>
      /* 填写样式 */
    </style>
  </head>

  <body>
    <!-- 填写标签 -->
    <script type="text/javascript">
        /**
         * 这里我们使用map代替循环的作用，map方法接收一个函数，处理原数组，返回一个数组
         * 由于返回值的函数被挂载到了全局变量上，而返回的函数使用了arr，至此形成闭包，
         * 也就是说调用result数组里面的每个函数都可以正常拿到对应的值
         * 如果你用var+for循环的话可能会出现问题，因为for循环下的var也会当作闭包的变量，
         * 在外部调用时，循环变量的值一直都是最后一个值，当然改用let可以解决这个情况
         * 而map方法则相当于块作用域（具体的原理我还没了解过，先用着），所以不会出现这样的问题
         */
      // 填写JavaScript
      const makeClosures = (arr, fn) => arr.map((item) => () => fn(item));

      //测例
      var arr = [1, 2, 3];
      var fn = function (x) {
        return x * x;
      };
      var result = makeClosures(arr, fn);
      console.log(((result[1]() === 4) === (fn(arr[1]) === 4)) === true);
    </script>
  </body>
</html>
